#include "tipodato.h"

TipoDato::TipoDato(int fila,int col):Expr(fila,col)
{
}

void TipoDato::setis(int tokentype)
{
    TokenType tt;
    is_ = tt.returntokenstring(tokentype);
}

string TipoDato::is()
{
    return is_;
}

void TipoDato::setValor(string valor)
{
    this->valor = valor;
}

string TipoDato::getValor()
{
    return this->valor;
}

Tipo_ts *TipoDato::validarSemantica(Tabla_Simbolos *tabla_de_tipo, Tabla_Simbolos *tabla_de_varaible)
{
    if(this->is_.compare("Literal_Entero")==0){
        return tabla_de_tipo->get("ENTERO")->getTipo();
    }else{
        if(this->is_.compare("Literal_Real")==0){
            return tabla_de_tipo->get("REAL")->getTipo();
        }else{
            if(this->is_.compare("FALSO")==0){
                return tabla_de_tipo->get("BOOLEANO")->getTipo();
            }else{
                if(this->is_.compare("VERDADERO")==0){
                    return tabla_de_tipo->get("BOOLEANO")->getTipo();
                }else{
                    if(this->is_.compare("Literal_Caracter")==0){
                        return tabla_de_tipo->get("CARACTER")->getTipo();
                    }else{
                        if(this->is_.compare("Literal_Cadena")==0){
                            int size = this->valor.size();
                            string id="CADENA";
                            stringstream out;
                            out << size;
                            id.append(out.str());
                            Item_ts* its = tabla_de_tipo->get(id);
                            if(its==0){
                                its = new Item_ts(new Cadena(size),id);
                            }
                            return its->getTipo();
                        }else{
                            stringstream out;
                            out<<"Literal No exite// Fila:"<<this->getFila()<<endl;
                            throw exception(out.str().c_str());
                        }
                    }
                }
            }
        }
    }
}

Codigo_Lugar TipoDato::generarCodigo(GenerarVariable* var,Tabla_Simbolos *tabla_de_tipo,Tabla_Simbolos *tabla_de_varaible)
{
    Codigo_Lugar cl;
    if(this->is_.compare("FALSO")==0){
        cl.codigo="0";
    }else if(this->is_.compare("VERDADERO")==0){
         cl.codigo="1";
    }else{
    cl.codigo=this->getValor();
    }

    return cl;
}
